package grupobbva.pe.operhc.util;

import static grupobbva.pe.operhc.util.Constant.*;
import static grupobbva.pe.operhc.util.Constant.PLAZO_MES;

import grupobbva.pe.operhc.domain.Mensaje;
import grupobbva.pe.operhc.domain.PerfilRol;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang.SerializationUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;

public final class Utilities extends GenericObject {
	
	public static String BROKER_SOCKET = "";
	public static String TERMINAL_CONTABLE = "";
	public static String TERMINAL_LOGICO = "";
	public static String TERMINAL_CLIO = "";
	public static String TERMINAL_FIJO = "";
	
	public static String QUEUE_DIST_IN = "";
	public static String QUEUE_DIST_OUT = "";
	public static String QMGR_HOST = "";
	public static String QUEUE_HOST_OUT = "";
	public static String ENCODING_HOST = "UTF-8";
	
	public static BigDecimal PORCENTAJE_SEGURO = new BigDecimal("0.036");
	public static BigDecimal PORTES_COMISION = new BigDecimal("10");

	public static void serializaObjeto(String nombreArchivo, Object objeto)
			throws Exception {
		FileOutputStream archivo = new FileOutputStream(nombreArchivo);
		SerializationUtils.serialize((Serializable) objeto, archivo);
	}

	public static Object deserializaObjeto(String nombreArchivo)
			throws Exception {
		FileInputStream archivo = new FileInputStream(nombreArchivo);
		return SerializationUtils.deserialize(archivo);
	}
	/*
	public static String formateaNumero(BigDecimal numero, String patron, Integer[] longitudNumeral) {
		NumberFormat formatter = new DecimalFormat(patron);
		formatter.setGroupingUsed(false);
		String[] numeral = StringUtils.splitPreserveAllTokens(formatter.format(numero), ",");
		numeral[0] = StringUtils.leftPad(numeral[0].trim(), longitudNumeral[0], "0");
		numeral[1] = StringUtils.rightPad(numeral[1].trim(), longitudNumeral[1], "0");
		return StringUtils.join(numeral);
	}
	*/
	public static String cadenaNumeroDecimal(BigDecimal numero, BigDecimal factorMantisa, Integer longitudNumeral) {
		return StringUtils.leftPad(numero.multiply(factorMantisa).toBigInteger().toString(), longitudNumeral, "0");
	}
	
	public static BigDecimal numeroDecimalCadena(String numero, BigDecimal defaultError) {
		return NumberUtils.isNumber(numero.trim()) ? new BigDecimal(numero) : defaultError;
	}
	
	public static String formateaPlazo(Integer plazo) {
		return PLAZO_MES.concat(StringUtils.leftPad(plazo.toString(), 3, "0"));
	}
	
	public static Date obtenerFechaCadena(String fechaCadena, String patron) {
		DateFormat formato = new SimpleDateFormat(patron);
		Date fecha = null;
		try {
			fecha = formato.parse(fechaCadena);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return fecha;
	}
	
	public static String obtenerNumeroFormateado(String importe) {
		DecimalFormatSymbols simbolos = new DecimalFormatSymbols(new Locale(LOCALIZACION));
		DecimalFormat formatter = new DecimalFormat(PATRON_MONEDA, simbolos);
		String importeFormateado = "";
		try {
			BigDecimal valorImporte = new BigDecimal(importe);
			importeFormateado = formatter.format(valorImporte);
		} catch(Exception e) {
			logger.error(GenericObject.formatException(e));
		}
		return importeFormateado;
	}
	
	public static String[] splitByPosition(String cadena, int posicion) {
		int longitud = cadena.length();
		String[] arregloCadenas = null;
		if(longitud % posicion == 0) {
			int elementos = longitud / posicion;
			arregloCadenas = new String[elementos];
			for(int i=0; i<elementos; i++) {
				arregloCadenas[i] = StringUtils.substring(cadena, i*posicion, (i+1)*posicion);
			}
		}
		return arregloCadenas;
	}
	
	public void modificarArchivos() {
		try {
			File directorio = new File("/logs/");
			if (directorio.isDirectory()) {
				File[] archivos = directorio.listFiles();
				for (File archivo : archivos) {
					if (archivo.isFile()) {
						archivo.setWritable(true, false);
					}
				}
			}
		} catch(Exception e) {
			logger.error(GenericObject.formatException(e));
		}
	}
	
	//ini MCG20140717
	public static String getObjectMensajeSession(String codigoMensaje,HttpServletRequest request){
		String valor= "";
		try {
			HttpSession session = request.getSession();		
			List<Mensaje> listaMensajes = (List<Mensaje>) session.getAttribute(Constant.MENSAJESHC_SESSION);
			for(Mensaje mensaj : listaMensajes){
				if(mensaj.getCodMensaje().equals(codigoMensaje) && mensaj.getActivo().equals("1") ){
					valor = mensaj.getDesMensaje();
					break;
				}
			}
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		return valor;
	}
	
	
	public static String getObjectActivoRolSession(String codigoRol,HttpServletRequest request){
		String activo= "0";
		try {
			HttpSession session = request.getSession();		
			List<PerfilRol> listaPerfilRol = (List<PerfilRol>) session.getAttribute(Constant.ROLESBYPERFIL_SESSION);
			for(PerfilRol rol : listaPerfilRol){
				if(rol.getRol().getCodigo().equals(codigoRol) ){
					activo = "1";
					break;
				}
			}
			
		} catch (Exception e) {
			activo = "0";
		}
		return activo;
	}
	//fin MCG20140717
	
}